#include "protocole.h"




/**
 * \function verifIp("char* ip")
 * \brief : Verification que la chaine de caractere ip correspond a une adresse ip valide
 * \param : ip chaine de caracteres
 * \return un booleen indiquant si l'adresse ip est valide
 **/
int verifIp(char* ip){
  int i,j=0,k;
  char bloc[4];//Chaine de caractères representant un bloc entre 2 points dans l'adresse ip
  long int nb;//Valeur du bloc courant
  for(i=0;i<4;i++){
    k=0;
    while((ip[j]!='\0')&&(ip[j]!='.')&&(k<3)){//On remplit la variable bloc
      bloc[k]=ip[j];
      j++;
      k++;
    }
    bloc[k]='\0';
    if((i<3)&&(ip[j]=='\0')){//Fin de la chaine avant d'avoir eu suffisamment de caracteres
      printf("Erreur!! Une adresse IP est au format: AAA.BBB.CCC.DDD\n\n");
      return 0;
    }
    else if((i==3)&&(ip[j]!='\0')){//Il y a des caracteres apres le 4eme nombre
      printf("Erreur!! Une adresse IP est au format: AAA.BBB.CCC.DDD\n\n");
      return 0;
    }
    else if(k==0){
      printf("Erreur!! Il y a au moins un chiffre entre deux points\n\n");
      return 0;
    }
    else{
      char* err=malloc(4*sizeof(char));
      nb=strtol(bloc,&err,10);
      if(*err!='\0'){
	printf("Erreur!! Il n'y a que des chiffres et des points dans une adresse ip\n\n");
	free(err);
	return 0;
      }
      else if(nb>255){
	printf("Erreur!! Les nombres de l'adresse ip doivent etre strictement inferieurs a 255\n\n");	
	return 0;
      }
      else{
	j++;
      }
    }
  }
  return 1;
}


/**
 * \function cmd_set(char *args)
 * \brief : Gestion de les commande set et de ses options
 * \param : args parametres de la fonction set, NULL s'il n'y en a pas
 **/
void cmd_set(char *args){
  if(args == NULL){//Liste des options disponibles dans le programme
    printf("Options disponibles :\n\n");
    printf("ip : %s\n",IP);
    printf("port : %d\n",PORT);
    printf("chemin_fichiers : %s\n",PATH);
    printf("\n");
  }

  else{//Modifie la valeur d'une option
    int i=0,j=0;
    char* option=malloc(MAX_TAILLE_OPTION*sizeof(char));//Dans un premier temps on recupere le nom de l'option
    char* valeur=malloc(MAX_TAILLE_VALEUR*sizeof(char));//et sa valeur
    while((args[i]!= '=') && (!isblank(args[i]))){//Tous les caracteres avant un espace ou le symbole espace sont dans option
      if(args[i]=='\0'){
	printf("Erreur de syntaxe, pour modifier la valeur d'une option, la bonne syntaxe est les suivante : option=valeur\n\n");
	option=NULL;
	valeur=NULL;
	break;
      }
      option[i]=args[i];
      i++;
    }
   
    if(option!=NULL){
    
      option[i]='\0';
      while(((args[i]== '=') || (isblank(args[i])))&&(args[i]!='\0')){//On va jusqu'au debut du deuxieme mot	 
	i++;
      }
      if(args[i]=='\0'){
	printf("Erreur de syntaxe, pour modifier la valeur d'une option, la bonne syntaxe est les suivante : option=valeur\n\n");
	valeur=NULL;
      }

      if(valeur!=NULL){
	while((args[i]!='\0')&&(!isblank(args[i]))){//Lecture de la valeur
	  valeur[j]=args[i];
	  i++;
	  j++;
	}
	valeur[j]='\0';
      }
    }
    
    if((option!=NULL)&&(valeur!=NULL)){
      if(strcasecmp(option,"ip")==0){
	if(verifIp(valeur)){
	  strcpy(IP,valeur);
	  printf("Votre nouvelle adresse ip est : %s\n",IP);
	}
      }
      else if(strcasecmp(option,"port")==0){
	if(!atoi(valeur)){
	  printf("Vous devez entrer une valeur entiere\n\n");
	}
	else{
	  PORT=atoi(valeur);
	  printf("Votre nouveau port est : %d\n",PORT);
	}
      }
      else if(strcasecmp(option,"chemin_fichiers")==0){
	strcpy(PATH,valeur);
	printf("Votre nouveau chemin pour les fichiers est : %s\n",PATH);
      }
      else{
	printf("L'option que vous voulez modifier n'existe pas\n");
      }
    }
  }
}


/**
 * \function decomposer_buff(char* buf,char* cmd,char* param)
 * \param : buf chaine entree par l'utlisateur
 * \param : cmd premier mot de buf
 * \param : param tout ce qu'il y a apres cmd
 *\ return un boolיen indiquant si il y a un parametre
 **/
int decomposer_buff(char* buf,char* cmd,char* param){
  int i=0;
  sscanf(buf, "%s", cmd);
  while((buf[i]!='\0')&&(!isblank(buf[i]))){//On va jusqu'a la fin du premier mot ou au premier espace
    i++;
  }
  while((buf[i]!='\0')&&(isblank(buf[i]))){//On va jusqu'a la fin des espaces s'il y en a
    i++;
  }
  if(buf[i]!='\0'){//On copie tout ce qui suit le premier mot dans param
    strcpy(param,&buf[i]);
  }
  else{
    return 0;
  }
  return 1;
}

/**
 * \function handle_prot(char* buf)
 * \brief : Gestionnaire du protocole de commandes de l'application
 * \param : buf chaine de caracteres entree par l'utilisateur
 * \return un booleen indiquant su tout s'est bien passe
 */
return_t handle_prot(char* buf){
  char* cmd=malloc(10*sizeof(char));
  char* param=malloc(40*sizeof(char));
  
  if(!decomposer_buff(buf,cmd,param))//S'il n'y a pas de parametre
    param=NULL;


  if (strcmp(cmd, "set") == 0) {
    cmd_set(param);
    free(cmd);
    free(param);
    return RT_OK;
  }
  else if((strcmp(cmd, "quit") == 0)||(strcmp(cmd, "exit") == 0)){
    free(cmd);
    return RT_OK;
  }
  else{
    fprintf(stderr,"commande non reconnue\n");
    return RT_ERR;
  }
}


int main(){ 
  char buf[MAX_TAILLE_CMD];
  do{
    buf[0]='\0';//On vide le buffer
    gets(buf);
    handle_prot(buf);
  }while(strcmp(buf,"quit")!=0 && strcmp(buf,"exit")!=0);

  return EXIT_SUCCESS;
}

